\documentclass{beamer}
\usepackage{ctex, hyperref}
\usepackage[T1]{fontenc}
% other packages
\usepackage{latexsym,amsmath,xcolor,multicol,booktabs,calligra}
\usepackage{graphicx,pstricks,listings,stackengine}

\author{孙凯威}
\title{五子棋与围棋需求分析}
%\subtitle{毕业设计开题报告}
\institute{组员：黄佳良、李生茂}
\date{\today}
\usepackage{Tsinghua}

% defs
\def\cmd#1{\texttt{\color{red}\footnotesize $\backslash$#1}}
\def\env#1{\texttt{\color{blue}\footnotesize #1}}
\definecolor{deepblue}{rgb}{0,0,1}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}
\definecolor{halfgray}{gray}{0.55}

\lstset{
    basicstyle=\ttfamily\small,
    keywordstyle=\bfseries\color{deepblue},
    emphstyle=\ttfamily\color{deepred},    % Custom highlighting style
    stringstyle=\color{deepgreen},
    numbers=left,
    numberstyle=\small\color{halfgray},
    rulesepcolor=\color{red!20!green!20!blue!20},
    frame=shadowbox,
}


\begin{document}

\kaishu
\begin{frame}
    \titlepage
    \begin{figure}[htpb]
        \begin{center}
            \includegraphics[width=0.2\linewidth]{pic/CUG_Logo-1.eps-89025.pdf}
        \end{center}
    \end{figure}
\end{frame}

\begin{frame}
    \tableofcontents[sectionstyle=show,subsectionstyle=show/shaded/hide,subsubsectionstyle=show/shaded/hide]
\end{frame}


\section{五子棋需求分析}
\subsection{实现目标}

\begin{frame}{实现目标}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item 实现五子棋开局初始化
        \item 实现打印整个五子棋界面
        \item 实现棋手下棋
        \item 实现能否下子的判断
        \item 实现下完一子后，棋面输出，标记当前落点，若能判断输赢，则输出输赢
        \item 实现禁手规则，长连禁手，四四禁手，三三禁手。
    \end{itemize}
\end{frame}

\subsection{禁手规则的实现流程}
\begin{frame}{禁手规则的实现流程}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item 白子无禁手
        \item 计算落子成活4的数量
        \item 计算能够成五点的数量
        \item 计算冲4的数量，可以根据公式冲4数量=能成五点的数量-活4数量*2
        \item 计算落子成活3的数量
        \item 实现长连禁手判断，实现通过坐标（row,col），方向向量u，计算该方向有多少连续同色棋子
        \item 实现落子为禁手后结束游戏
    \end{itemize}
\end{frame}

\subsection{各模块接口定义}
\begin{frame}{各模块接口定义}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item void init();//游戏开局初始化
        \item void DrawBoard();//打印整个游戏界面
        \item int live4(int row, int col);//落子成活4的数量
        \item int cheng5(int row, int col);//成5点的数量
        \item int live3(int row, int col);//落子成活3的数量
        \item void player();//棋手下棋
        \item void go(int row, int col)//落下一子,判输赢
        
        更多的接口定义见附录一
    \end{itemize}
\end{frame}

\section{围棋需求分析}
\subsection{实现目标}

\begin{frame}{实现目标}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item 实现接收落子信息的功能
        \item 实现每一步棋执行的函数
        \item 实现判断该子是否无气
        \item 实现盘活该子以及所有相连同色子
    \end{itemize}
\end{frame}

\subsection{每一步棋执行的实现流程}
\begin{frame}{每一步棋执行的实现流程}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item 如果不是第一步，先移植上一步的棋盘局面
        \item 判断落子处是否无子
        \item 每一步的棋局都新建一个char型辅助二维数组来标记棋子是否有气（0表示未访问，1表示无气，2表示有气）
        \item 判断该步落子是否无气
        \item 判断周围敌子是否无气
        \item 判断是否违反规则：如果某方在此下子，会使该子立即呈无气状态，同时又不能提取对方的棋子，这个点叫做“禁着点”，该方不能在此下子。
        \item 判断是否违反规则：禁止全局同形：无论哪一方，在成功进行了着子、提子操作后，棋盘局面不能和任何之前的局面相同。
    \end{itemize}
\end{frame}

\subsection{各模块接口定义}
\begin{frame}{各模块接口定义}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item void everyStep(int step, vector<vector<vector<char>>>\& board);  //每一步棋执行的函数
        \item bool breathlessOrNot(vector<vector<vector<char>>>\& board, vector<vector<char>>\& flag, int step, int i, int j); //判断该子是否无气
        \item void setAlive(vector<vector<vector<char>>>\& board, vector<vector<char>>\& flag, int step, int i, int j);  //盘活该子以及所有相连同色子
    \end{itemize}
\end{frame}


\section{框架需求分析}

\subsection{实现目标}

\begin{frame}{实现目标}
    \begin{itemize}
        \item 设计选择菜单
        \item 调用它们相应的接口
    \end{itemize}
\end{frame}

\subsection{框架的实现流程}
\begin{frame}{框架的实现流程}
    \begin{itemize} % 当然，除了alert，手动在里面插 \pause 也行
        \item 设计选择界面，通过switch让玩家进行选择
        \item 通过选择进行调用函数
        \item 可以通过函数指针的方式，也可以直接调用。
    \end{itemize}
\end{frame}

\section{附录}

\begin{frame}{附录：五子棋额外接口}
    \begin{itemize}
        \item int out(int i, int j);//打印棋盘
        \item bool inboard(int row, int col);//判断(row,col)是否在棋盘内
        \item int same(int row, int col, int key);//判断2个棋子是否同色
        \item int num(int row, int col, int u);//坐标（row,col），方向向量u，返回该方向有多少连续同色棋子
        \item int chong4(int row, int col);//冲4的数量
        \item bool overline(int row, int col);//长连禁手
        \item bool ban(int row, int col);//判断落子后是否成禁手
        \item bool end\_(int row, int col);//(row,col)处落子之后是否游戏结束
        \item bool ok(int row, int col);//能否落子
    \end{itemize}
\end{frame}

\end{document}